package com.ruoyi.common.utils.date;

import java.text.SimpleDateFormat;
import java.time.*;
import java.time.format.DateTimeFormatter;
import java.time.temporal.TemporalAdjusters;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * 日期时间工具类，提供常用的日期时间操作方法。
 */
public class DateTimeUtil {

    private static final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");

    /**
     * 将日期字符串转换为指定格式的日期时间字符串。
     * @param dateStr 日期字符串（例如 "2024-04-01"）
     * @param startOfDay 如果为 true，则设置为当天开始（00:00:00），否则设置为当天结束（23:59:59）
     * @return 格式化的日期时间字符串
     */
    public static String formatDateTime(String dateStr, boolean startOfDay) {
        LocalDate date = LocalDate.parse(dateStr);
        LocalDateTime dateTime = startOfDay ? date.atStartOfDay() : date.atTime(23, 59, 59);
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        return dateTime.format(formatter);
    }

    public static String convertToEnglish(String chineseWeekday) {
        switch (chineseWeekday) {
            case "星期一":
                return "Mon";
            case "星期二":
                return "Tue";
            case "星期三":
                return "Wed";
            case "星期四":
                return "Thu";
            case "星期五":
                return "Fri";
            case "星期六":
                return "Sat";
            case "星期日":
                return "Sun";
            default:
                throw new IllegalArgumentException("Invalid weekday: " + chineseWeekday);
        }
    }

    /**
     * 获取今天的开始时间（凌晨0点），格式化为"年月日时分秒"
     * @return 今天的开始时间字符串
     */
    public static String getTodayStart() {
        return LocalDateTime.of(LocalDate.now(), LocalTime.MIDNIGHT).format(formatter);
    }

    /**
     * 获取今天的结束时间（23:59:59），格式化为"年月日时分秒"
     * @return 今天的结束时间字符串
     */
    public static String getTodayEnd() {
        return LocalDateTime.of(LocalDate.now(), LocalTime.of(23, 59, 59)).format(formatter);
    }

    /**
     * 获取本周的开始时间（周一凌晨0点），格式化为"年月日时分秒"
     * @return 本周的开始时间字符串
     */
    public static String getWeekStart() {
        LocalDate monday = LocalDate.now().with(TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY));
        return LocalDateTime.of(monday, LocalTime.MIDNIGHT).format(formatter);
    }

    /**
     * 获取本周的结束时间（周日23:59:59），格式化为"年月日时分秒"
     * @return 本周的结束时间字符串
     */
    public static String getWeekEnd() {
        LocalDate sunday = LocalDate.now().with(TemporalAdjusters.nextOrSame(DayOfWeek.SUNDAY));
        return LocalDateTime.of(sunday, LocalTime.of(23, 59, 59)).format(formatter);
    }

    /**
     * 获取本月的开始时间（月初0点），格式化为"年月日时分秒"
     * @return 本月的开始时间字符串
     */
    public static String getMonthStart() {
        return LocalDateTime.of(LocalDate.now().withDayOfMonth(1), LocalTime.MIDNIGHT).format(formatter);
    }

    /**
     * 获取本月的结束时间（月末23:59:59），格式化为"年月日时分秒"
     * @return 本月的结束时间字符串
     */
    public static String getMonthEnd() {
        LocalDate endOfMonth = LocalDate.now().with(TemporalAdjusters.lastDayOfMonth());
        return LocalDateTime.of(endOfMonth, LocalTime.of(23, 59, 59)).format(formatter);
    }

    public static String getCurrentDateString() {
        // 获取当前日期
        LocalDate today = LocalDate.now();
        // 创建一个日期格式器
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
        // 使用格式器将日期转换为字符串
        return today.format(formatter);
    }

    /**
     * 获取两个日期之间的所有日期（年月日）。
     * @param startDateTime 开始日期字符串，格式为"yyyy-MM-dd HH:mm:ss"。
     * @param endDateTime 结束日期字符串，格式为"yyyy-MM-dd HH:mm:ss"。
     * @return 包含所有日期（年月日）的列表。
     */
    public static List<String> getDatesBetween(String startDateTime, String endDateTime) {
        List<String> dates = new ArrayList<>();
        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");

        LocalDate startDate = LocalDate.parse(startDateTime, dateTimeFormatter);
        LocalDate endDate = LocalDate.parse(endDateTime, dateTimeFormatter);

        // 循环遍历每一天，直到结束日期
        while (!startDate.isAfter(endDate)) {
            dates.add(startDate.format(dateFormatter));
            startDate = startDate.plusDays(1); // 将日期向前推进一天
        }

        return dates;

    }

}
